import { IntervalTimeUnit, UnitAttrStruct } from "../../types/L_Type";
import L_Run from "../../utils/L_Run";
import L_String from "../../utils/L_String";
import EventX from "./EventX";


//注意runCallback属性为返回当前移动距离的回调函数  方便调用前配置调用间隔 建议使用Math.Mod函数
export type UNIT_MOVE_EVENT_DTL={
  startCallback?:(x:number,y:number)=>void,
  runCallback?:(curMovDis:number,x:number,y:number)=>void,
  endCallback?:(curMovDis:number,x:number,y:number)=>void
} 

type TRAJECTORY='LINE' | 'CUSTOM'

/** 单位移动相关事件 */
export default class UnitMoveEvent extends EventX {


    dtl?:UNIT_MOVE_EVENT_DTL
   // playerIndex:number 
    angle:number
    moveUnit:unit
    /**单次移动距离 */
    onceMoveDist:number
    /**记录一下最初计划执行次数  此属性只在箭矢类弹反重置飞行持续时间有用  防止反弹后的箭矢没有反弹动力 */
    originPlanExecTimes:number
    /**记录一下MovingUnit类中的mid 方便某些情况用到 只记录id弱引用 */ 
    mid:number
    /**不同类型的轨迹 */
    trajectory:TRAJECTORY
    /**已经移动的距离 */
    movedDis=0  
    /**自定义移动方式的函数 */
    customMoveFunc?:(hasExecNums:number,moveUnit:unit)=>{x:number,y:number}


    constructor(
        trajectory:TRAJECTORY,
        intervalUnit: IntervalTimeUnit,
        intervalVal: number,
        execTimes:number,   //单次移动执行次数
        onceMoveDist:number,
        angle:number,   //移动角度
        moveUnit:unit,
        mid:number,
        dtl?:UNIT_MOVE_EVENT_DTL,
        customMoveFunci?:(hasExecNums:number,moveUnit:unit)=>{x:number,y:number}
    ) {
        
        super('UNIT_MOVE',intervalUnit,intervalVal,execTimes)
        this.originPlanExecTimes=execTimes
        this.onceMoveDist=onceMoveDist
        this.dtl=dtl
        this.moveUnit=moveUnit
        this.angle=angle
        this.mid=mid
        this.trajectory=trajectory
        if(customMoveFunci!=undefined){
          //this.customMoveFunc=customMoveFunci
          //customMoveFunci(77,2);
          //console.log("设置customMoveFunci")
          this.customMoveFunc=(hasExecNumsx,moveUnitx)=>{return customMoveFunci(hasExecNumsx,moveUnitx)}
        }
        // if(customMoveFunc!=undefined){
        //   this.customMoveFunc=(hasExecNums:number,moveUnit:unit)=>{return customMoveFunc?.(hasExecNums,moveUnit)}
        // }
        //this.playerIndex=L_Run.GetUnitPlayerIndex_L(dtl.createArrowUnitX.unit)
        // if(dtl.moveDtl.trackUnit==false){
        //     //是目标点飞行  可以确定角度
        //     this.angle=L_Math.getAngle(L_Run.GetUnitX_L(dtl.arrowUnit),L_Run.GetUnitY_L(dtl.arrowUnit),dtl.moveDtl.targetX,dtl.moveDtl.targetY)
        // }else{
        //     //打击单位
        //     this.angle=L_Math.getAngleWithUnit(dtl.arrowUnit,dtl.moveDtl.trackTarget.unit)
        // }

    } 


  public start(): void {
     this.dtl?.startCallback?.(L_Run.GetUnitX_L(this.moveUnit),L_Run.GetUnitY_L(this.moveUnit))
     console.log("单位准备移动")

  }
  public run(): void {
    
    let targetXY=undefined
    if( this.trajectory=='LINE'){
      targetXY=L_Run.SetUnitXYToAgDis(this.moveUnit,this.angle,this.onceMoveDist)
    }else if(this.trajectory=='CUSTOM'){
      let rm=this.hasExecNums as number
      console.log('UnitMoveEvent:',rm)
      targetXY=this.customMoveFunc?.(this.hasExecNums,this.moveUnit)
    }
    //记录已经移动的距离
    this.movedDis=this.movedDis+this.onceMoveDist
    this.dtl?.runCallback?.(this.movedDis,targetXY!.x,targetXY!.y)

    console.log("单位移动")
  }
  /**
   * 非executor类请不要直接调用  使用endImmed来柔性调用
   */
  public end(): void {
    this.dtl?.endCallback?.(this.movedDis,L_Run.GetUnitX_L(this.moveUnit),L_Run.GetUnitY_L(this.moveUnit))
    console.log("单位停止移动")

  }
  /**
   * 立即结束事件  外部类使用此方法来柔性结束事件
   */
  public endImmed(){
    super.endImmed()
  }
 
 
 

  
}  